const expressConfig = require("./express");
const system = require("./service/system");
const task = require("./service/task");
const util = require("./util");
const T = require("./type");
const URI_PERFIX = "/api";

module.exports = (app)=>{
    // 配置 express
    expressConfig(app);
    
    // 引入路由
    // { "/test": (req, res, body)=>{} }
    /**
     * @type {Array<{
     *     [...]: T.Base.Service
     * }>}
     */
    let routers = [task, system];
    
    let uris = [];
    routers.forEach((routers)=>{
        for (const uri in routers) {
            if(typeof routers[uri] === "function") {
                if(uris.indexOf(uri) < 0) {
                    useRouter(app, URI_PERFIX + uri, routers[uri]);
                } else {
                    throw new Error(`${uri}路由已经被配置，无法重复配置相同的路由!`);
                }
            }
        }
    });

    // 配置主页 
    app.get(['/', '/index', '/home', '/index.html', '/index.php'], function(req, res) {
        res.redirect('/src/res/index.html');
    });
}

/**
 * 使用路由，在这里统一支持 get post 请求
 * @param {Express} app 
 * @param {String} uri 
 * @param {T.Base.Service} service 
 */
function useRouter(app, uri, service) {
    app.get(uri, function(req, res){
        server(service, req, res, true);
    });
    app.post(uri, function(req, res){
        server(service, req, res, false);
    });
}

/**
 * 服务
 * @param {T.Base.Service} service 
 * @param {Request} req 
 * @param {Response} res 
 * @param {Boolean} getFlag 是否是GET请求，用于调整参数的优先级
 */
function server(service, req, res, getFlag){
    try{
        // 合并GET和POST数据，POST数据优先
        const params = req.query; // GET参数
        const data = req.body;    // POST数据
        const allParams = getFlag ? { ...data, ...params } : { ...params, ...data };
        let re = service(req, res, allParams);
        if(util.isPromise(re)) {
            re.then(re=>{
                if(util.result.MANUAL_REPLY != re) {
                    util.result.send(res, util.result.succeed("成功", re));
                }
            }).catch(err=>{
                console.error(err);
                let re = util.result.error("服务处理时发生异常!", err);
                res.status(re.code).send(re);
            });
        } else {
            if(util.result.MANUAL_REPLY != re) {
                util.result.send(res, util.result.succeed("成功", re));
            }
        }
    }catch(err){
        console.error(err);
        let re = util.result.error("服务处理时发生异常!", err);
        res.status(re.code).send(re);
    }
}